package com.chyb.cloud.config;

import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.RequestOriginParser;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Component;

@Component
public class MyRequestOriginParser implements RequestOriginParser
{
    @Override
    public String parseOrigin(HttpServletRequest httpServletRequest) {
        //配置接受依据的参数名serverName
        /*
        原理：调用方信息通过 ContextUtil.enter(resourceName, origin) 方法中的 origin 参数传入。
        调用过程：
        这里先不管，我们直接看到AbstractSentinelInterceptor这个拦截器，中的preHandler(请求前)方法中的
                ...
                String origin = this.parseOrigin(request);
                String contextName = this.getContextName(request);
                ContextUtil.enter(contextName, origin);
                ....
        这里的ContextUtil.enter(contextName, origin);就是我们要找的怎么调用方信息，
        这时我们直接向前面找origin,这里就到了String origin = this.parseOrigin(request);我们在看到这个方法，
                ....
                origin = this.baseWebMvcConfig.getOriginParser().parseOrigin(request);
                ....
                return origin;
                ....
        这个时候我们就知道origin就是调用RequestOriginParser接口的parseOrigin()方法，而我们实现它并对和这个方法进行重写也就相当于间接的对origin进行修改了

        */
        return httpServletRequest.getParameter("serverName");
    }
}


